//
//  Person.swift
//  构造函数
//
//  Created by Summer on 2017/11/14.
//  Copyright © 2017年 Summer. All rights reserved.
//

import UIKit

// 需要加上@objcMembers 这么一个关键字。
// 类的属性前面需要加上@objc关键词或者类前面加上@objcMembers ，否则运行时访问不了类的属性
// 原因：在Swift 4中继承 NSObject 的 swift class 不再默认全部 bridge 到 OC，如果我们想要使用的话我们就需要在class前面加上@objcMembers 这么一个关键字。
// 引用: 在 swift 3 中除了手动添加 @objc 声明函数支持 OC 调用还有另外一种方式：继承 NSObject。class 继承了 NSObject 后，编译器就会默认给这个类中的所有函数都标记为 @objc ，支持 OC 调用。苹果在Swift 4 中苹果修改了自动添加 @objc 的逻辑：一个继承 NSObject 的 swift 类不再默认给所有函数添加 @objc。只在实现 OC 接口和重写 OC 方法时才自动给函数添加 @objc 标识。

// KVC同理


@objcMembers class Person: NSObject {
    
    // 可选属性，默认为nil不是0，不会分配空间，如果使用KVC设置数值，会导致崩溃
    var name: String?
    
    // 可选属性，默认为nil不是0，不会分配空间，如果使用KVC设置数值，会导致崩溃
    var age: Int=0

    
    init(dict: [String: Any]) {
        
        super.init()
        //使用 self 的方法 'setValuesForKeys' 之前,应该调用 super.initt(),否则会奔溃:Use of 'self' in method call 'setValuesForKeys' before super.init initializes self
        //KVC方法是 OC 的方法,在运行的时候给对象发送消息
        //执行'setValuesForKeys',首先要求对象已经实例化完成
        setValuesForKeys(dict)
    }

}
